home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr05
/
xnot12a.zip
/
TTYKBD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-04
|
10KB
|
398 lines
#include "jam.h"
#include "def.h"
#ifndef WINDOWED
# ifndef CURSES
# include <dos.h>
# endif
# ifdef MSC
# include <bios.h>
# endif /* MSC */
#endif
#define KMETA METABIT
#ifdef CURSES
static int rn_(mapCursesKey, (int foo));
#endif
static CONSTANT char *keystrings[] = {
"Home", "Down-Arrow", "Up-Arrow", "Left-Arrow",
"Right-Arrow", "Page-Up", "Page-Down", "End",
"Delete", "Insert", "Control-Left", "Control-Right",
"Control-PgUp", "Control-PgDn", "Control-Home", "Control-End",
"F1", "F2", "F3", "F4",
"F5", "F6", "F7", "F8",
"F9", "F10", "FS1", "FS2",
"FS3", "FS4", "FS5", "FS6",
"FS7", "FS8", "FS9", "FS10",
"FC1", "FC2", "FC3", "FC4",
"FC5", "FC6", "FC7", "FC8",
"FC9", "FC10",
#if defined(WINDOWED) || defined(CURSES)
"F11", "FS11", "FC11", "F12",
"FS12", "FC12",
"Num-Lock", "KP-/", "KP-*", "KP--",
"KP-7", "KP-8", "KP-9", "KP-+",
"KP-4", "KP-5", "KP-6",
"KP-1", "KP-2", "KP-3", "KP-Enter",
"KP-0", "KP-.",
/* Of course someone wanted these added AFTER I got the
* keypad, etc added in so the order is all messed up. Not worth my
* time to fix all the .h files and this table...sorry (JAM)
*/
"FM1", "FM2", "FM3", "FM4",
"FM5", "FM6", "FM7", "FM8",
"FM9", "FM10", "FM11", "FM12",
"FCS1", "FCS2", "FCS3", "FCS4",
"FCS5", "FCS6", "FCS7", "FCS8",
"FCS9", "FCS10", "FCS11", "FCS12",
"", /* KEXTEND, invisible and untypeable! */
"KFind", "KSelect", "KSFind", "KSSelect",
#endif
};
/* I like my tables static thus this access function.
* Caller assumed to be well behaved, no range checking (JAM)
*/
CONSTANT char *getkeystrings(i)
int i;
{
return(keystrings[i]);
}
/* Convert IBM bios extended scan codes to appropriate function key values
*/
#ifndef WINDOWED
static CONSTANT KCHAR extended[] = {
-1, -1, -1, 0, /* 0-3 */
-1, -1, -1, -1, /* 4-7 */
-1, -1, -1, -1, /* 8-11 */
-1, -1, -1, -1, /* 12-15 */
KMETA|'Q', KMETA|'W', KMETA|'E', KMETA|'R',/* 16-19 */
KMETA|'T', KMETA|'Y', KMETA|'U', KMETA|'I',/* 20-23 */
KMETA|'O', KMETA|'P', -1, -1, /* 24-27 */
-1, -1, KMETA|'A', KMETA|'S',/* 28-31 */
KMETA|'D', KMETA|'F', KMETA|'G', KMETA|'H',/* 32-35 */
KMETA|'J', KMETA|'K', KMETA|'L', -1, /* 36-39 */
-1, -1, -1, -1, /* 40-43 */
KMETA|'Z', KMETA|'X', KMETA|'C', KMETA|'V',/* 44-47 */
KMETA|'B', KMETA|'N', KMETA|'M', -1, /* 48-51 */
-1, -1, /* oops - miscounted */ /* 52-53 */
-1, -1, -1, -1, /* 54-57 */
-1, KF1, KF2, KF3, /* 58-61 */
KF4, KF5, KF6, KF7, /* 62-65 */
KF8, KF9, KF10, -1, /* 66-69 */
-1, KHOME, KUP, KPGUP, /* 70-73 */
-1, KLEFT, -1, KRIGHT, /* 74-77 */
-1, KEND, KDOWN, KPGDN, /* 78-81 */
KINSERT, KDELETE, KSF1, KSF2, /* 82-85 */
KSF3, KSF4, KSF5, KSF6, /* 86-89 */
KSF7, KSF8, KSF9, KSF10, /* 90-93 */
KCF1, KCF2, KCF3, KCF4, /* 94-97 */
KCF5, KCF6, KCF7, KCF8, /* 98-101 */
KCF9, KCF10, KMETA|KF1, KMETA|KF2,/* 102-105 */
KMETA|KF3, KMETA|KF4, KMETA|KF5, KMETA|KF6,/* 106-109 */
KMETA|KF7, KMETA|KF8, KMETA|KF9, KMETA|KF10,/* 110-113 */
-1, KCLEFT, KCRIGHT, KCEND, /* 114-117 */
KCPGDN, KCHOME, KMETA|'1', KMETA|'2',/* 118-121 */
KMETA|'3', KMETA|'4', KMETA|'5', KMETA|'6',/* 122-125 */
KMETA|'7', KMETA|'8', KMETA|'9', KMETA|'0',/* 126-129 */
KMETA|'-', KMETA|'=', KCPGUP, /* 130-132 */
};
#endif
#define NEXTENDED (sizeof(extended)-sizeof(KCHAR))
static KCHAR savedkey = -1;
getkbd()
{
return (ttgetc());
}
/*
* Get keyboard character, and interpret
* any special keys on the keyboard.
*/
ttgetc()
{
KCHAR temp;
while (savedkey == -1)
getakey();
temp = savedkey;
savedkey = -1;
return temp;
}
getakey()
{
#ifdef WINDOWED /* JAM */
WindowGetEvent((void *)&savedkey);
#else /* WINDOWED */
# ifdef CURSES
int foo;
long currtime;
KCHAR kchar;
static long lasttime = 0;
struct tm *timestruct1, *timestruct2;
/* check for input in internal queue before
* checking hardware queue
*/
queued:
if (DOSReturnKCHAR(&kchar))
{
savedkey = kchar;
return (TRUE);
}
if (lasttime == 0)
time(&lasttime);
/* See if input, else do timeouts; this is kind of expensive
*/
while (1)
{
time(&currtime);
timestruct1 = localtime(&lasttime);
timestruct2 = localtime(&currtime);
if (timestruct2->tm_sec - timestruct1->tm_sec >= TIME_INC)
{
DoTimer();
lasttime = 0;
}
foo = wgetch(stdscr);
if (foo != ERR)
break;
foo = mapCursesKey(foo);
if (foo == KEY_MIN)
goto queued; /* ugh! goto */
}
savedkey = foo;
# else
union REGS rg;
KCHAR kchar;
/* check for input in internal queue before
* checking hardware queue
*/
if (DOSReturnKCHAR(&kchar))
{
savedkey = kchar;
return (TRUE);
}
rg.h.ah = 0; /* read keyboard */
/* rg.h.ah = 0x10; read enhanced keyboard */
int86(0x16, &rg, &rg);
if (rg.h.al)
{
if (rg.h.al == '\b' && rg.h.ah == 0x0E)
rg.h.al = 0x7F; /* transform backspace key into delete */
/* control H is still backspace */
savedkey = rg.h.al; /* normal key value */
}
else
{
if (rg.h.ah >= NEXTENDED)
savedkey = -1;
else
savedkey = extended[rg.h.ah];
}
# endif /* CURSES */
#endif /* WINDOWED */
return TRUE;
}
#ifndef WINDOWED /* not needed */
pollkbd()
{
# ifdef MSC
return _bios_keybrd(_KEYBRD_READY);
# else
# ifdef CURSES
return(FALSE);
# else
return bioskey(1);
# endif /* CURSES */
# endif /* MSC */
}
#endif
/* See if events pending; used only by display.c (update)
* to forstall screen update in deference to handling input.
*
* For Windows, lookahead only for events which cause another redraw
* else not updating makes cursor motion jumpy.
*/
mytypeahead()
{
#ifdef WINDOWED
return (WindowLookaheadEvent());
#else
if (savedkey != -1)
return 1;
if (pollkbd())
getakey();
return (savedkey != -1);
#endif
}
ttykeymapinit()
{
/* mg 2a no longer lets me easily bind things at run time. */
/* instead, I make up a keymap, and link it in at compile time */
return TRUE;
}
PF ibm_keys[] = {
gotobol, /* Home */
forwline, /* Down */
backline, /* Up */
backchar, /* Left */
forwchar, /* Right */
backpage, /* Page Up */
forwpage, /* Page Dn */
gotoeol, /* End */
forwdel, /* Delete */
openline, /* Insert */
backword, /* Control Left */
forwword, /* Control Right */
gotobob, /* Control PgUp */
gotoeob, /* Control PgDn */
gotobop, /* Control HOME */
gotoeop, /* Control END */
/* function keys - initially unassigned
*/
rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
rescan, rescan, rescan, rescan, rescan, rescan,
#ifdef WINDOWED
rescan, rescan, rescan, /* F11 */
rescan, rescan, rescan, /* F12 */
rescan, rescan, rescan,rescan, /* NUMLOCK / * - */
rescan, rescan, rescan,rescan, /* 7 8 9 + */
rescan, rescan, rescan, /* 4 5 6 */
rescan, rescan, rescan,rescan, /* 1 2 3 ENTER */
rescan, rescan, /* 0, DEL */
rescan, rescan, rescan, rescan, /* META F1, F2, F3, F4 */
rescan, rescan, rescan, rescan, /* META F5, F6, F7, F8 */
rescan, rescan, rescan, rescan, /* META F9, F10, F11, F12 */
rescan, rescan, rescan, rescan, /* Cntrl-Shift F1, F2, F3, F4 */
rescan, rescan, rescan, rescan, /* Cntrl-Shift F5, F6, F7, F8 */
rescan, rescan, rescan, rescan, /* Cntrl-Shift F9, F10, F11, F12 */
silent_extend, /* KEXTEND, invisible and untypeable */
rescan, rescan, rescan,rescan, /* KFind, KSelect, & shifted
* (not normally on Windows PC's)
*/
#endif
};
#ifdef CURSES
static int mapCursesKey(c)
int c;
{
switch(c)
{
case KEY_DOWN:
c = KDOWN;
break;
case KEY_UP:
c = KUP;
break;
case KEY_LEFT:
c = KLEFT;
break;
case KEY_SLEFT:
c = KCLEFT;
break;
case KEY_RIGHT:
c = KRIGHT;
break;
case KEY_SRIGHT:
c = KCRIGHT;
break;
case KEY_HOME:
c = KHOME;
break;
case KEY_SHOME:
c = KCHOME;
break;
case KEY_BACKSPACE:
c = KDELETE;
break;
case KEY_F(1):
c = KF1;
break;
case KEY_F(2):
c = KF2;
break;
case KEY_F(3):
c = KF3;
break;
case KEY_F(4):
c = KF4;
break;
case KEY_F(5):
c = KF5;
break;
case KEY_F(6):
c = KF6;
break;
case KEY_F(7):
c = KF7;
break;
case KEY_F(8):
c = KF8;
break;
case KEY_F(9):
c = KF9;
break;
case KEY_F(10):
c = KF10;
break;
case KEY_NPAGE:
c = KPGDN;
break;
case KEY_PPAGE:
c = KPGUP;
break;
case KEY_END:
c = KEND;
break;
default:
if (c >= KEY_MIN)
c = KEY_MIN;
break;
}
return(c);
}
#endif